﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/*
* University of Reykjavík
* Brjóstagjöf.is is the product of first-year practical programming course
* for computer science students at said university
*
* URL: http://code.google.com/p/scags 
* Authors: 
* Ástvaldur Sigurðsson
* Guðjón Jónsson
* Kristín Inga Vigfúsdóttir
* Steinar Bragi Sigurðsson
* Sveinn Ernstsson
*/

namespace skags.Models
{
    public class ForumRepository
    {
        DBDataContext db = new DBDataContext();
        /* Vistar breytingar í grunni */
        public void Save()
        {
            db.SubmitChanges();
        }

        /* 
         * Skilar 5 flokkum fyrir spjallið.
         * Notað í ForumController 
         */
        public IEnumerable<ForumViewModel> Get5AllCat()
        {
            UserRepository urep = new UserRepository();

            var result = (from c in db.ForumCategories
                          orderby c.Title ascending
                          select new ForumViewModel
                                     {
                                         Category = c,
                                         Threads = (from t in db.ForumThreads
                                                    where t.CategoryID == c.ID
                                                    select new ThreadViewModel
                                                               {
                                                                   AuthorID = t.AuthorID,
                                                                   AuthorIntID = urep.GetIDByHashID(t.AuthorID),
                                                                   CategoryID = t.CategoryID,
                                                                   DateCreated = t.DateCreated,
                                                                   ID = t.ID,
                                                                   ThreadText = DBRepository.LimitWords(t.ThreadText,""),
                                                                   Title = t.Title,
                                                                   UserName = urep.GetUsernameByID(urep.GetIDByHashID(t.AuthorID))
                                                                }).Take(5)
                          });

            return result;
        }

        /* 
         * Naer í alla þraeði innan spjallþráðaflokka.
         * Notað í ForumController.
         */
        public IEnumerable<ThreadViewModel> GetThreadsByCatID(int id)
        {
            UserRepository urep = new UserRepository();

            return (from t in db.ForumThreads
                          where t.CategoryID == id
                          orderby t.DateCreated descending 
                          select new ThreadViewModel
                                     {
                                         AuthorID = t.AuthorID,
                                         AuthorIntID = urep.GetIDByHashID(t.AuthorID),
                                         CategoryID = t.CategoryID,
                                         DateCreated = t.DateCreated,
                                         ID = t.ID,
                                         ThreadText = t.ThreadText,
                                         Title = t.Title,
                                         UserName = urep.GetUsernameByID(urep.GetIDByHashID(t.AuthorID))   
                                     });
        }

        /*
         * Naer í alla þraeði
         * Eins og er þá er þetta ekki notað, en viljum eiga upp á breytingamöguleika
         */

        
        /*
         * Baeta við þraeði (grein) á spjallþráð.
         * Notað í ForumController.
         */ 
        public void AddThread(ForumThread thread)
        {
            db.ForumThreads.InsertOnSubmit(thread);
            Save();
        }

        /*
         * Baeta við flokk á spjallþraeði
         * Notað í ForumController.
         */ 
        public void AddForumCategory(ForumCategory item)
        {
            db.ForumCategories.InsertOnSubmit(item);
            Save();
        }

        /*
         * Eyðir spjallflokk og öllum hans þráðum.
         * Notað í AdminController.
         */ 
        public void DeleteForumCategory(int id)
        {
            // Finnum allar greinar í þessum flokk
            var threadsToDelete = from s in db.ForumThreads
                                  where s.CategoryID == id
                                  select s;
            // Finnum færsluna í gagnagrunninum
            var catToDelete = GetForumCategoryByID(id);

            var answersToDelete = from a in db.ThreadAnswers
                                  join t in db.ForumThreads on a.ThreadID equals t.ID
                                  where t.CategoryID == id
                                  select a;

            db.ForumThreads.DeleteAllOnSubmit(threadsToDelete);
            db.ThreadAnswers.DeleteAllOnSubmit(answersToDelete);
            db.ForumCategories.DeleteOnSubmit(catToDelete);

            Save();
        }
        /*
         * Naer í alla flokka fyrir spjallþráðinn
         * Notað í Admin- og ForumController.
         */ 
        public IEnumerable<ForumCategory> GetAllCategories()
        {
            var result = from s in db.ForumCategories
                         orderby s.ID descending
                         select s;

            return result;
        }

        /*
         * Saekir flokka á spjallþraeði eftir númeri
         * Notað í Admin- og ForumController.
         */ 
        public ForumCategory GetForumCategoryByID(int id)
        {
            return (from s in db.ForumCategories
                    where s.ID == id
                    select s).SingleOrDefault();
        }

        /*
         * Saekir þráð eftir númeri.
         * Notað í ForumController.
         */ 
        public ForumThread GetThreadByID(int id)
        {
            return db.ForumThreads.SingleOrDefault(u => u.ID == id);
        }

        /*
         * Eyðir þráði af spjallborði
         * Notað í ForumController.
         */ 
        public void DeleteThread(ForumThread thread)
        {
            db.ForumThreads.DeleteOnSubmit(thread);
            Save();
        }

        /*
         * Uppfaerir upplýsingar um flokk á spjalli
         * Notað í ForumController
         */ 
        public void UpdateForumCategory(ForumCategory item)
        {
            var theCat = GetForumCategoryByID(item.ID);
            if (theCat != null)
            {
                theCat.Title = item.Title;
            }

            Save();
        }


        /*
         * Svör
         */

        /*
         * Skilar svari eftir númeri.
         * Notað í ForumController.
         */ 
        public ThreadAnswer GetAnswerByID(int id)
        {
            var result = (from a in db.ThreadAnswers
                          where a.ID == id
                          select a).SingleOrDefault();
            return result;
        }

        /*
         * Skilar svörum eftir númeri þráðar.
         * NOtað í ForumController.
         */ 
        public IEnumerable<AnswerViewModel> GetAnswersByThreadID(int id)
        {
            UserRepository urep = new UserRepository();

            var result = (from a in db.ThreadAnswers
                          where a.ThreadID == id
                          orderby a.DateCreated
                          select new AnswerViewModel
                                     {
                                         Answer = a.Answer,
                                         UserID = a.UserID,
                                         FullName = urep.GetNameByHashID(a.UserID),
                                         DateCreated = a.DateCreated,
                                         UserIntID = urep.GetIDByHashID(a.UserID),
                                         UserName = a.aspnet_User.UserName,
                                         ID = a.ID,
                                         UserRole = urep.GetRoleByHashID(a.UserID)
                                     });

            return result;
        }

        /*
         * Baetir við svari.
         * Notað í ForumController
         */ 
        public void AddAnswer(ThreadAnswer answer)
        {
            db.ThreadAnswers.InsertOnSubmit(answer);
            Save();
        }

        /*
         * Eyðr svari.
         * Notað í ForumController
         */ 
        public void DeleteAnswer(ThreadAnswer answer)
        {
            db.ThreadAnswers.DeleteOnSubmit(answer);
            Save();
        }

        /*
         * Eyðir öllum svörum ef flokki er eitt.
         * Notað í ForumController
         */ 
        public void DeleteAllAnswersByThreadID(int id)
        {
            var answers = (from s in db.ThreadAnswers
                           where s.ThreadID == id
                           select s);

            db.ThreadAnswers.DeleteAllOnSubmit(answers);
            Save();
        }

    }
}